﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

namespace mrp16062010
{
    class Cizelge
    {
        public string Id { get; set; }
        public List<Stok> StokListe = new List<Stok>();
        public List<Rota.RotaParcasi> RotaList = new List<Rota.RotaParcasi>();
        public List<CizelgeIsMerkezi> Merkezler = new List<CizelgeIsMerkezi>();
        private Tarih tarih=new Tarih();

        public Tarih Tarihler
        {
            get { return tarih; }
            set { tarih = value; }
        }
        
        public Cizelge()
        {
            foreach (IsMerkezi i in OrnekVeri.IsMerkeziList)
            {
                CizelgeIsMerkezi ciz = new CizelgeIsMerkezi();
                ciz.Merkez = i;
                Merkezler.Add(ciz);
            }
        }

        public void TatilEkle(List<IsParcasi> tatilList)
        {
            foreach (CizelgeIsMerkezi i in Merkezler)
            {
                i.IsListe.AddRange(tatilList);
                //i.IsListe.AddRange(tatilList.Where(p => p.TatilIsMerkezi.Kod == i.Merkez.Kod));
            }
        }

        public List<IsMerkezi> IsMerkezleri
        {
            get
            {
                List<IsMerkezi> liste = new List<IsMerkezi>();
                foreach (CizelgeIsMerkezi ci in Merkezler)
                {
                    liste.Add(ci.Merkez);
                }
                return liste;
            }
        }

        public static IsParcasi ParcaEkle(Cizelge cizelge, Rota.Operasyon operasyonGelen,DateTime? baslangicTarihi,DateTime? bitisTarihi,int recDerinlik, int grupNo, Siparis siparis)
        {
            IsParcasi parca = new IsParcasi(operasyonGelen, siparis);
            
            parca.Kaydet.IsKaydet = false;
            parca.Kaydet.Index = recDerinlik;
            parca.Kaydet.GrupIndex = grupNo;
            CizelgeIsMerkezi ci = cizelge.Merkezler.Where<CizelgeIsMerkezi>(p => p.Merkez.Kod == operasyonGelen.IsMerkeziRota.Kod).Single();

            //if (parca.SiparisBilgi.SiparisNo != 999)
            //{

            //}

            if (baslangicTarihi.HasValue==true && bitisTarihi.HasValue==false)
            {
                //İleri Yükleme
                parca.YuklemeTipi = true;
                parca.IleriHesapla(baslangicTarihi.Value);
                parca.Uzunluk = parca.BitTarihi - parca.BasTarihi;
                ci.IleriYukle(parca, 0);
            }
            else if (baslangicTarihi.HasValue==false && bitisTarihi.HasValue==true)
            {
                //Geri Yükleme
                parca.YuklemeTipi = false;
                parca.GeriHesapla(bitisTarihi.Value);
                parca.Uzunluk = parca.BitTarihi - parca.BasTarihi;
                if (parca.Uzunluk.TotalMinutes==3132&& parca.IM.Kod==12)
                {
                    
                }
                ci.GeriYukle(parca);
            }
            
            if (parca.BasTarihi < cizelge.tarih.BaslangicTarihi)
            {
                cizelge.tarih.BaslangicTarihi = parca.BasTarihi;
            }
            if (parca.BitTarihi > cizelge.tarih.BitisTarihi)
            {
                cizelge.tarih.BitisTarihi = parca.BitTarihi;
            }
            
            
            return parca;
        }

        public void YedekAl()
        {
            /*
            stoklistetemp = kopyalayici.clone<list<stok>>(stokliste);
            rotatemp = (list<rotaparcasi>)clone(rota);
            merkezlertemp = (list<cizelgeısmerkezi>)clone(merkezler);
            */
        }

        public void GeriAl(int? Index, int? GrupNo)
        {
            if (Index.HasValue && GrupNo.HasValue)
            {
                foreach (CizelgeIsMerkezi cim in Merkezler)
                {
                    cim.IsListe = cim.IsListe.Where(p => !(p.Kaydet.Index == Index.Value && p.Kaydet.GrupIndex == GrupNo.Value && p.Kaydet.IsKaydet == false)).ToList<IsParcasi>();
                }
            }
            else if (Index.HasValue == false && GrupNo.HasValue == true)
            {
                foreach (CizelgeIsMerkezi cim in Merkezler)
                {
                    cim.IsListe = cim.IsListe.Where(p => !(p.Kaydet.GrupIndex == GrupNo.Value && p.Kaydet.IsKaydet == false)).ToList<IsParcasi>();
                }
            }

        }

        public void SonrasiniGeriAl(int Index, int GrupNo)
        {
            foreach (CizelgeIsMerkezi cim in Merkezler)
            {
                cim.IsListe = cim.IsListe.Where(p => !(p.Kaydet.Index >= Index && p.Kaydet.GrupIndex == GrupNo)).ToList<IsParcasi>();
            }
        }

        public void Kaydet(int? Index, int? GrupNo)
        {
            if (Index.HasValue && GrupNo.HasValue)
            {
                foreach (CizelgeIsMerkezi cim in Merkezler)
                {
                    foreach (IsParcasi ip in cim.IsListe.Where(p => p.Kaydet.Index == Index.Value && p.Kaydet.GrupIndex == GrupNo.Value))
                    {
                        ip.Kaydet.IsKaydet = true;
                    }
                }
            }
            else if (Index.HasValue == false && GrupNo.HasValue == true)
            {
                foreach (CizelgeIsMerkezi cim in Merkezler)
                {
                    foreach (IsParcasi ip in cim.IsListe.Where(p => p.Kaydet.GrupIndex == GrupNo.Value))
                    {
                        ip.Kaydet.IsKaydet = true;
                    }
                }
            }
        }

        //bool isYuklendi=true;
        //List<Rota.RotaParcasi> TempYuklenen = new List<Rota.RotaParcasi>();
        /*
        public bool IleriYukleme(Stok stok, RotaParcasi rota, DateTime baslangicTarihi, int derinlik)
        {
            if (derinlik == 0)
            { rota = rota.EnUzunDal(); }

            DateTime SonTarih = baslangicTarihi;
            //Rota parçasının operasyonlarını iş parçası haline getirir
            foreach (IsMerkeziOperasyon op in rota.IsMerOpList)
            {
                IsParcasi parca = new IsParcasi(stok, op);//Stok hatalı!
                parca.isKaydet = false;
                parca.IleriHesapla(SonTarih, new TimeSpan(0, 5, 0));//TODO Hazirlık süresi veritabanından gelecek
                CizelgeIsMerkezi ci = Merkezler.Where<CizelgeIsMerkezi>(p => p.Merkez.Kod == op.IsMerkezi_.Kod).Single();
                ci.IleriYukle(parca);
                SonTarih = parca.BitTarihi;
            }

            //En alttaki en uzun parçanın olası komşu dallarına bakıyoruz.
            foreach (RotaParcasi rp in rota.Ust.RotaList.Where(p => p != rota))
            {
                //Önce geri yükleme denenir. Olmazsa Minimum tarihten itibaren ileri yükleme çalıştırılır.
                //Dikkat edilmesi gereken öğe bu dalların düğümünün son tarihinin düzgün güncellenmesidir.
                //GeriYukleKomutu geriYuk = new GeriYukleKomutu(this, stok, );
                //geriYuk.

            }

            //Her rota ağaç dalının içine girmek için bir foreach
            foreach (RotaParcasi rp in rota.RotaList)
            {
                Stok GeciciStok = stok.BilesenList.Where<Stok>(x => x.Kod == rp.StokKodu).Single();
                IleriYukleme(GeciciStok, rp, SonTarih, derinlik + 1);
            }
            isYuklendi = true;
            return isYuklendi;
        }*//*
        public bool IleriYukleme(Stok stok, Rota.RotaParcasi rota, DateTime baslangicTarihi, int recderinlik)
        {
            bool YuklendiMi = false;
            if (recderinlik == 0)
            {
                rota = rota.EnUzunDal();
            }
            DateTime SonTarih = baslangicTarihi;
            //Rota parçasının operasyonlarını iş parçası haline getirir
            foreach (Rota.Operasyon op in rota.OperasyonList)
            {
                IsParcasi parca = new IsParcasi(rota.Stok.Stok, op);
                parca.Kaydet.IsKaydet = false;
                parca.Kaydet.Index = recderinlik;
                parca.IleriHesapla(baslangicTarihi, new TimeSpan(0, 5, 0));//TODO Hazirlık süresi veritabanından gelecek
                CizelgeIsMerkezi ci = Merkezler.Where<CizelgeIsMerkezi>(p => p.Merkez.Kod == op.IsMerkeziRota.Kod).Single();
                ci.IleriYukle(parca);
                SonTarih = parca.BitTarihi;
            }
            List<Rota.RotaParcasi> digerDallar = (from x in rota.Ust.AltParca
                                       where x != rota
                                       select x).ToList();
            foreach (Rota.RotaParcasi parca in digerDallar)
            {
                foreach (Rota.Operasyon op in parca.OperasyonList)
                {
                    if (op.AltParca.Count>0)
                    {
                        foreach (Rota.RotaParcasi opp in op.AltParca)
                        {
                            GeriYukleme(opp.Stok.Stok,opp,opp.
                        }
                    }
                }
                if (GeriYukleme(parca.Stok.Stok, parca, SonTarih, baslangicTarihi, recderinlik + 1))
                {
                    Kaydet(recderinlik + 1);
                }
                else
                {
                    GeriAl(recderinlik + 1);
                    if (IleriYukleme(parca.Stok.Stok, parca, baslangicTarihi, recderinlik + 1))
                    {
                        Kaydet(recderinlik+1);
                    }
                    else
                    {
                        GeriAl(recderinlik + 1);
                    }
                }
            }
            YuklendiMi = true;
            return YuklendiMi;
        }
        */
        /*
        public bool GeriYukleme(Stok stok, Rota.RotaParcasi rota, DateTime bitisTarihi, DateTime MinimumTarih, int derinlik)
        {
            DateTime SonTarih = bitisTarihi;
            //Rota parçasının operasyonlarını iş parçası haline getirir
            foreach (IsMerkeziOperasyon op in rota.IsMerOpList.Reverse <IsMerkeziOperasyon>())
            {
                IsParcasi parca = new IsParcasi(stok, op);
                parca.isKaydet 0= false;
                parca.GeriHesapla(SonTarih, new TimeSpan(0, 5, 0));
                if (parca.BasTarihi < MinimumTarih)
                {
                    isYuklendi = false;
                    return isYuklendi;
                }
                CizelgeIsMerkezi ci= Merkezler.Where<CizelgeIsMerkezi>(p => p.Merkez.Kod == op.IsMerkezi_.Kod).Single();
                ci.GeriYukle(parca);
                SonTarih= parca.BasTarihi;
            }

            //Her rota ağaç dalının içine girmek için bir foreach
            foreach (RotaParcasi rp in rota.RotaList.Reverse<RotaParcasi>())
            {
                Stok GeciciStok = stok.BilesenList.Where<Stok>(x => x.Kod == rp.StokKodu).Single();
                if (!GeriYukleme(GeciciStok, rp, SonTarih, MinimumTarih, derinlik + 1))
                {
                    isYuklendi = false;
                }
                else
                {
                    isYuklendi = true;
                }
            }
            //isYuklendi = true;
            return isYuklendi;
        }*/

        private bool test = false;

        public bool Test
        {
            get { return test; }
            set
            {
                foreach (CizelgeIsMerkezi item in this.Merkezler)
                {
                    item.Test = value;
                }
                test = value;
            }
        }
        
    }
}
